import { IsString, IsOptional, IsBoolean, Length, IsNumber, IsNotEmpty, IsArray } from 'class-validator';
import { PaginationDto } from '@dtos/pagination.dto';

export class CreateRoleDto {
  @IsString({ message: '角色编码必须是字符串' })
  @IsNotEmpty({ message: '角色编码不能为空' })
  @Length(1, 50, { message: '角色编码长度为 1-50 位' })
  code: string;

  @IsString({ message: '角色名称必须是字符串' })
  @IsNotEmpty({ message: '角色名称不能为空' })
  @Length(1, 50, { message: '角色名称长度为 1-50 位' })
  name: string;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean = true;

  @IsString({ message: '备注必须是字符串' })
  @IsOptional()
  @Length(0, 100, { message: '备注长度不能超过 100 位' })
  remark?: string;

  @IsOptional()
  @IsArray({ message: '菜单 ID 列表必须是数组' })
  @IsNumber({}, { each: true, message: '菜单 ID 必须是数字' })
  menuIds?: number[];
}

export class UpdateRoleDto {
  @IsString({ message: '角色编码必须是字符串' })
  @IsNotEmpty({ message: '角色编码不能为空' })
  @Length(1, 50, { message: '角色编码长度为 1-50 位' })
  code: string;

  @IsString({ message: '角色名称必须是字符串' })
  @IsOptional()
  @Length(1, 50, { message: '角色名称长度为 1-50 位' })
  name?: string;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean;

  @IsString({ message: '备注必须是字符串' })
  @IsOptional()
  @Length(0, 100, { message: '备注长度不能超过 100 位' })
  remark?: string;

  @IsOptional()
  @IsArray({ message: '菜单 ID 列表必须是数组' })
  @IsNumber({}, { each: true, message: '菜单 ID 必须是数字' })
  menuIds?: number[];
}

export class RolePageDto extends PaginationDto {
  @IsString({ message: '角色名称必须是字符串' })
  @IsOptional()
  @Length(0, 50, { message: '角色名称长度不能超过 50 位' })
  name?: string;

  @IsString({ message: '角色编码必须是字符串' })
  @IsOptional()
  @Length(0, 50, { message: '角色编码长度不能超过 50 位' })
  code?: string;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean;
}
